pub mod d_base;
pub mod d_iflet;
pub mod d_match;
pub mod d_enum;
pub mod d_null;
pub mod d_struct;
pub mod d_slice;
pub mod d_ref;
pub mod d_ownership;
pub mod d_vector;
pub mod d_string;
pub mod d_error;
pub mod d_map;
pub mod d_t;
pub mod d_trait;
pub mod d_lifecycle;
pub mod d_test;
pub mod d_closure;
pub mod d_iter;
pub mod d_box;

pub fn run() {
    {
        /* Rust 的代码组织
        主要包括
            - 哪些细节可以暴露，哪些细节是私有的
            - 作用域内哪些名称有效
            -...
        模块系统
            - Package(包):Cargo的特性，让你构建、测试、共享crate
            - Crate(单元包):一个模块树，它可产生一个library或可执行文件
            - Module (模块)、use:让你控制代码的组织、作用域、私有路径
            - Path (路径):为struct、function 或module等项命名的方式

        Pacakge 和 Crate
            - Crate 的类型:
                - binary
                - library
            - Crate Root:
                - 是源代码文件
                - Rust 编译器从这里开始，组成你的Crate的根 Module
            - 一个Package:
                - 包含1个Cargo.toml，它描述了如何构建这些Crates
                - 只能包含0-1个library crate
                - 可以包含任意数量的binary crate
                - 但必须至少包含一个crate(library或binary)

        Cargo 的惯例
            - src/main.rs:
                - binary crate 的 crate root
                - crate 名与package 名相同
            - src/lib.rs:
                - package 包含一个 library crate
                - library crate 的 crate root
                - crate 名与 package名相同
            - Cargo 把 crate root文件交给rustc来构建library 或binary
            - 一个 Package可以同时包含src/main.rs和 src/lib.rs
                - 一个 binary crate，一个library crate
                - 名称与 package名相同
            - 一个 Package可以有多个binary crate:
                - 文件放在 src/bin
                - 每个文件是单独的binary crate
        
        Crate 的作用
            - 将相关功能组合到一个作用域内，便于在项目间进行共享
                - 防止冲突
            - 例如 rand crate，访问它的功能需要通过它的名字:rand

        定义 module 来控制作用域和私有性
            - Module:
                - 在一个 crate内，将代码进行分组
                - 增加可读性，易于复用
                - 控制项目(item)的私有性。public、private
                - 例子： src/main.rs src/lib.rs 叫 crate roots, 这两个文件(任一)的内容形成crate的模块，位于整个模块数的根部
                    crate
                    |-  front_of_house
                        |-  hosting
                        |   |-  add_to_waitlist
                        |   |-  seat_at_table
                        |-  serving
                            |-  take_order
                            |-  serve_order
                            |-  take_payment
            - 建立 module:
                - mod 关键字
                - 可嵌套
                - 可包含其它项(struct、enum、常量、trait、函数等)的定义
            
         路径(Path): see lib.rs
         */
        println!(" --------- module ------------- ");
        crate::eat_at_resta();
    }
}